package com.itheima.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.reggie.entity.ShoppingCart;
import com.itheima.reggie.mapper.ShoppingCartMapper;
import com.itheima.reggie.service.ShoppingCartService;
import com.itheima.reggie.utils.BaseContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

@Service
@Transactional
public class ShoppingCartServiceImpl  implements ShoppingCartService {
    
    @Autowired
    private ShoppingCartMapper mapper;
    
    
    /**
     * 清空购物车 （按照用户id来清空）
     *
     * @return
     */
    @Override
    public int clean() {
        
        //1. 创建条件对象
        LambdaQueryWrapper<ShoppingCart> qw = new LambdaQueryWrapper<>();
        qw.eq(ShoppingCart::getUserId , BaseContext.get());
        
        //2. 执行删除
        return mapper.delete(qw);
    }
    
    /**
     * 查看购物车数据 (按照用户id来查询)
     *
     * @return
     */
    @Override
    public List<ShoppingCart> list() {
        
        //1. 设置条件
        LambdaQueryWrapper<ShoppingCart> qw = new LambdaQueryWrapper<>();
        qw.eq(ShoppingCart::getUserId , BaseContext.get());
        qw.orderByDesc(ShoppingCart::getCreateTime);
        
        //2. 执行查询
        return mapper.selectList(qw);
    }
    
    /**
     * 添加购物车
     *      1. 加入购物车虽然也是添加操作，但是它和以前的添加不一样！
     *      2. 购物车里面可以添加重复性的菜品|套餐，如果是重复性的菜品|套餐，那么就让数量 + 1
     *      3. 否则就产生一条新的记录，表示这个菜品|套餐是第一次被添加到购物车来。
     *
     *      操作步骤：
     *          1. 先查询这个菜品|套餐 在购物车表里面的数据。
     *          2. 判定查询的对象是否为空？
     *              2.1 如果为空， 表明这个商品|套餐 没有在购物车里面，那么此时执行添加操作
     *              2.2 如果不为空， 表明这个商品|套餐 有在购物车里面，那么此时执行更新操作
     *                  2.2.1 更新数量 、 金额
     *       4. 最后要记得返回这个ShoppingCart的对象！
     *
     * @param shoppingCart 页面提交上来，要加入到购物车表的菜品|套餐 数据。
     * @return
     */
    @Override
    public ShoppingCart add(ShoppingCart shoppingCart) {
        
        LambdaQueryWrapper<ShoppingCart> qw = new LambdaQueryWrapper<>();
        
        //1. 先查询这个菜品|套餐在购物车表里面的数据
        //1.1 添加菜品|套餐的id查询条件，先判断现在要加入购物车表的数据是菜品还是套餐？
        Long dishId = shoppingCart.getDishId();
        
        //1.2 如果dishId 不等于 null, 即表明这个要加入购物车表的是菜品数据
        if(dishId != null ){
            qw.eq(ShoppingCart::getDishId , shoppingCart.getDishId());
        }else{
            qw.eq(ShoppingCart::getSetmealId , shoppingCart.getSetmealId());
        }
        
        //1.3 追加 用户id，表明要查询这个用户的购物车数据里面的这件菜品|套餐的数据
        qw.eq(ShoppingCart::getUserId , BaseContext.get());
    
        //1.4 执行查询...
        ShoppingCart cartInDB = mapper.selectOne(qw);
        
        //2. 判断对象，有还是没有？
        if(cartInDB == null ){
            //表明这件菜品|套餐在数据库表里面没有记录，此时要执行添加操作
            shoppingCart.setNumber(1);
            shoppingCart.setCreateTime(LocalDateTime.now());
            shoppingCart.setUserId(BaseContext.get()); //设置这个菜品到了购物车表里面，能够表示出来，它属于哪一个用户的购物车数据
            mapper.insert(shoppingCart);
            
            return shoppingCart;
        }else{
            //表明这件菜品|套餐在数据库表里面有记录，修改数量..
            cartInDB.setNumber(cartInDB.getNumber() + 1);
            mapper.updateById(cartInDB);
            
            return cartInDB;
        }
    }
}
